/**
 * 
 */
package com.lifeware.research.endo.controllers;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.lifeware.research.endo.controllers.utils.ControllersUtils;
import com.lifeware.research.endo.models.SchedaBaseSummary;
import com.lifeware.research.endo.models.entities.Ghiandole;
import com.lifeware.research.endo.models.utils.EncryptException;
import com.lifeware.research.endo.services.PazienteService;
import com.lifeware.research.endo.views.PazienteProxy;

/**
 * <p>Controllore per le azioni possibili su di un paziente.
 * </p> 
 *
 * @author  Riccardo Cardin, (C) 2012 Lifeware
 * @version 1.0
 *
 */
@Controller
public class PazienteController {
	
	private Map<String, String> malattie;
	
	@Autowired
	private PazienteService pazienteService;
	
	@Autowired
	private ControllersUtils controllersUtils;
	
	@RequestMapping(value="/paziente")
	public String scegli(Model model) {
		
		return "paziente";
	}
	
	@RequestMapping(value="/paziente/crea")
	public String crea(Model model) {
		
		/* Recupero la lista di ghiandole */
		List<Ghiandole> ghiandole = this.pazienteService.getGhiandole();
		
		model.addAttribute("paziente", new PazienteProxy());
		model.addAttribute("malattie", this.malattie);
		model.addAttribute("ghiandole", ghiandole);
		 
		return "nuovoPaziente";
	}
	
	@RequestMapping(value="/paziente/insert")
	public String inserisci(HttpSession session) {
		
		PazienteProxy pazienteProxy = (PazienteProxy) session.getAttribute("paziente");
		
		/* Inserisce il paziente nel modello */
		this.pazienteService.inserisci(pazienteProxy);
		
		return "redirect:/paziente";   // TODO
	}
	
	@RequestMapping(value="/paziente/cerca", method=RequestMethod.GET)
	public String cerca(Model model, HttpSession session) 
			throws EncryptException {
		
		String returnResource = null;
		
		/* Verifico la presenza del codice fiscale */
		String codFiscale = (String) session.getAttribute("codFiscale");
		
		PazienteProxy paziente = new PazienteProxy();
		
		if (codFiscale != null) {
			
			/* Elimino il codice fiscale dalla sessione */
			session.removeAttribute("codFiscale");
			
			/* Imposto il codice fiscale nel paziente */
			paziente.setIdentificativo(codFiscale);
			
			returnResource = this.recuperaDettaglio(paziente, model, session);
		} else {
		
			/* Inserisco il paziente nel modello */
			model.addAttribute("paziente", paziente);
		
			returnResource = "cercaPaziente";
		}   // end if (codFiscale != null)...
		
		return returnResource;
	}
	
	@RequestMapping(value="/paziente/cerca", method=RequestMethod.POST)
	public String recuperaDettaglio(PazienteProxy paziente, Model model, HttpSession session) 
			throws EncryptException {
		
		/* Recupero il codice fiscale in chiaro e lo inserisco nel modello */
		String codFiscale = paziente.getIdentificativo();
		model.addAttribute("codFiscale", codFiscale);
		
		/* Inserisco in sessione il codice fiscale del paziente */
		session.setAttribute("codFiscale", codFiscale);
		
		/* Anonimizzo il paziente */
		this.controllersUtils.anonimizza(paziente);
		
		/* Recupero il riassunto delle schede base */
		List<SchedaBaseSummary> schedeBase = 
				this.pazienteService.getSchedeBasePaziente(paziente);
		
		/* Inserisco nel model la lista delle schede base */
		model.addAttribute("schedeBase", schedeBase);
		
		/* Inserisco il modello per le scheda base scelta */
		model.addAttribute("malattiaPaziente", new SchedaBaseSummary());
		
		return "dettaglioPaziente";
	}

	public Map<String, String> getMalattie() {
		return malattie;
	}

	public void setMalattie(Map<String, String> malattie) {
		this.malattie = malattie;
	}

	public PazienteService getPazienteService() {
		return pazienteService;
	}

	public void setPazienteService(PazienteService pazienteService) {
		this.pazienteService = pazienteService;
	}

	public ControllersUtils getControllersUtils() {
		return controllersUtils;
	}

	public void setControllersUtils(ControllersUtils controllersUtils) {
		this.controllersUtils = controllersUtils;
	}
}
